﻿@namespace AntDesign.Internal
@typeparam TValue
@inherits DatePickerPanelBase<TValue>
@using System.Globalization;

@{
    var calendar = this.DatePicker.CultureInfo.Calendar;

    DateTime monthFirstDayDate = new DateTime(PickerValue.Year, PickerValue.Month, 1, 0, 0, 0);
    int monthFirstDayOfWeek = (int)calendar.GetDayOfWeek(monthFirstDayDate);

    // sunday should be 7
    if (monthFirstDayOfWeek == 0)
    {
        monthFirstDayOfWeek = 7;
    }

    int diffDay = (int)this.DatePicker.CultureInfo.DateTimeFormat.FirstDayOfWeek - monthFirstDayOfWeek;
    DateTime startDate = monthFirstDayDate.AddDays(diffDay);
}

<div class='@($"{PrefixCls}-panel")'>
    <DatePickerTemplate TValue="TValue" 
                        @attributes="GetAttritubes()"
                           MaxRow="6"
                           MaxCol="7"
                           ViewStartDate="startDate"
                           ShowFooter="@ShowToday"
                           GetRowClass="GetRowClass"
                           IsInView="date => DateHelper.IsSameMonth(date, PickerValue)"
                           IsToday="date => DateHelper.IsSameDay(date, DatePicker.CurrentDate)"
                           IsSelected="date => !IsWeek && DateHelper.IsSameDay(date, Value)"
                           GetColTitle='date => date.ToString(this.DatePicker.CultureInfo.GetDateLocale().DateFormat, this.DatePicker.CultureInfo)'
                           OnRowSelect="OnRowSelect"
                           OnValueSelect="OnValueSelect"
                           GetNextColValue="date => date.AddDays(1)">
        <RenderPickerHeader>
            <DatePickerHeader TValue="TValue"
                              @attributes="GetAttritubes()"
                              ShowSuperPreChange="@(!(IsRange && PickerIndex == 1))"
                              ShowPreChange="@(!(IsRange && PickerIndex == 1))"
                              ShowNextChange="@(!(IsRange && PickerIndex == 0))"
                              ShowSuperNextChange="@(!(IsRange && PickerIndex == 0))"/>
        </RenderPickerHeader>
        <RenderTableHeader>
            <tr>
                @if (IsWeek)
                {
                    <th></th>
                }
                @foreach(string weekDay in this.DatePicker.CultureInfo.GetDateLocale().ShortWeekDays)
                {
                    <th>@(weekDay)</th>
                }
            </tr>
        </RenderTableHeader>
        <RenderFisrtCol>
            @if (IsWeek)
            {
                <td class="@(PrefixCls)-cell @(PrefixCls)-cell-weak">
                    @DateHelper.GetWeekOfYear(context)
                </td>
            }
        </RenderFisrtCol>
        <RenderColValue Context="currentColDate">
            @currentColDate.Day
        </RenderColValue>
    </DatePickerTemplate>
</div>

@if (RenderExtraFooter != null)
{
    <div class="@(PrefixCls)-footer">
        <div class="@(PrefixCls)-footer-extra">
            @RenderExtraFooter
        </div>
    </div>
}

@if (ShowToday && !IsRange && Picker != DatePickerType.Time)
{
    <div class="@(PrefixCls)-footer">
        <a class="@(PrefixCls)-today-btn" 
           @onclick="e => { OnSelectDate(DateTime.Now); Close(); }">
            @this.DatePicker.CultureInfo.GetDateLocale().Today
        </a>
    </div>
}


@code {
    [Parameter]
    public bool IsWeek { get; set; } = false;

    [Parameter]
    public bool ShowToday { get; set; } = false;

    private string GetRowClass(DateTime viewDate)
    {
        string selectedRowClass = IsWeek && DateHelper.IsSameWeak(viewDate, Value) ? $"{PrefixCls}-week-panel-row-selected" : "";
        string rowClass = IsWeek ? $"{PrefixCls}-week-panel-row" : "";

        return $"{rowClass} {selectedRowClass}";
    }

    private void OnRowSelect(DateTime viewDate)
    {
        if (IsWeek)
        {
            OnSelectDate(viewDate);
        }
    }

    private void OnValueSelect(DateTime viewDate)
    {
        if (!IsWeek)
        {
            OnSelectDate(viewDate);
        }
    }
}